package com.yj.timecapsule.common.utils;


import com.yj.timecapsule.common.enums.ErrorCode;
import com.yj.timecapsule.common.error.BusinessException;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;

import java.util.Date;
import java.util.Map;

/**
 * @author jwt utli
 */
@Slf4j
public class JwtUtil {
    /**
     * 生成token
     * @param id token的Id
     * @param secretKey 加密的密码
     * @param map token中的数据集合
     * @return
     */
    public static String create(String id , String secretKey , Map<String,Object> map){
        log.info("开始生成jwt :{}",map);
        // 创建JWT对象的构建器
        JwtBuilder builder = Jwts.builder();

        // 设置过期时间为3小时
        Date date = new Date(System.currentTimeMillis() + 3 * 60 * 60 * 1000);

        String token = builder.setClaims(map)
                // 设置签发时间为当前时间
                .setIssuedAt(new Date())
                // 设置ID
                .setId(id)
                // 设置过期时间
                .setExpiration(date)
                // 使用HS256算法进行签名，并设置密钥
                .signWith(SignatureAlgorithm.HS256, secretKey)
                .compact();
        log.info("生成token成功:{}",token);
        return token;
    }

    /**
     * 解析token
     * @param key 加密密码
     * @param token token
     * @return claims
     */
    public static Claims parse(String key , String token){
        try {
            return Jwts.parser()
                    .setSigningKey(key)
                    .parseClaimsJws(token)
                    .getBody();
        }catch (RuntimeException e){
            throw new BusinessException(ErrorCode.USER_NOT_LOGIN);
        }
    }
}

